//package com.ksd.web.controller.system;
//
//import com.ksd.quartz.util.TaskConstans;
//import com.ksd.system.domain.*;
//import com.ksd.system.service.*;
//import com.ksd.common.config.PlayDataConfig;
//import com.ksd.common.core.controller.BaseController;
//import com.ksd.common.core.domain.AjaxResult;
//import com.ksd.common.utils.StringUtils;
//import com.ksd.common.utils.file.FileUploadUtils;
//import com.ksd.web.controller.domain.FileNode;
//import com.ksd.web.controller.domain.UploadFileObjec;
//import com.ksd.web.controller.service.MovieFileService;
//import com.ksd.web.controller.service.SongFileService;
//import com.ksd.web.controller.upload.*;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.*;
//
//import java.io.File;
//import java.util.*;
//
//@RestController
//public class FileTreeController extends BaseController {
//
//    private static final Logger logger = LoggerFactory.getLogger(FileTreeController.class);
//    @Autowired
//    private ISysOperLogService sysOperLogService;
//    @Autowired
//    private ISysContentDataService sysContentDataService;
//    @Autowired
//    private ISysTvDataService sysTvDataService;
//    @Autowired
//    private ISysTvTypeService sysTvTypeService;
//    @Autowired
//    private ISysSongDataService sysSongDataService;
//    @Autowired
//    private SongFileService songFileService;
//    @Autowired
//    private MovieFileService movieFileService;
//    @Autowired
//    private ISysBatchService sysBatchService;
//
//    @GetMapping("/api/files")
//    public AjaxResult getFiles() {
//
//        // 指定目录路径
////        String rootPath = "C:\\Users\\wuyun\\Desktop";
//        String rootPath = PlayDataConfig.getUploadUsbPath();
//        logger.info("获取USB硬盘内的文件目录: "+rootPath);
//        File rootDirectory = new File(rootPath);
//        List<FileNode> nodes = new ArrayList<>();
//        if (rootDirectory.exists() && rootDirectory.isDirectory()) {
//            for (File file : rootDirectory.listFiles()) {
//                String name = file.getName();
//                    FileNode node = new FileNode();
//                    node.setName(file.getName());
//                    node.setPath(file.getAbsolutePath());
//                    node.setLeaf(!file.isDirectory());
//                    nodes.add(node);
//            }
//        }
//
//        return AjaxResult.success(nodes);
//    }
//
//    private List<FileNode> getChildNodes(File directory) {
//        List<FileNode> childNodes = new ArrayList<>();
//        if (directory.exists() && directory.isDirectory()) {
//            for (File file : directory.listFiles()) {
//                String name = file.getName();
////                if (name.endsWith(".zip")){
//                    FileNode node = new FileNode();
//                    node.setName(file.getName());
//                    node.setPath(file.getAbsolutePath());
//                    node.setLeaf(!file.isDirectory());
//                    if (!node.isLeaf()) {
//                        node.setChildren(getChildNodes(file)); // 递归调用
//                    }
//                    childNodes.add(node);
////                }
//            }
//        }
//        return childNodes;
//    }
//    @PostMapping("/api/filesByPath")
//    public AjaxResult getFilesByPath(@Validated @RequestBody FileNode fileNode) {
//        System.out.println("path: "+fileNode.getPath());
//        File directory = new File(fileNode.getPath());
//        List<FileNode> nodes = new ArrayList<>();
//        if (directory.exists() && directory.isDirectory()) {
//            for (File file : directory.listFiles()) {
//                String name = file.getName();
//                FileNode node = new FileNode();
//                node.setName(file.getName());
//                node.setPath(file.getAbsolutePath());
//                node.setLeaf(!file.isDirectory());
//                nodes.add(node);
//            }
//        }
//        return AjaxResult.success(nodes);
//    }
//    private Map<String, Integer> uploadProgressMap = new HashMap<>();
//    private Map<String, Integer> uploadProgressTotalMap = new HashMap<>();
//
//    @PostMapping("/api/startUpload")
//    public AjaxResult startUpload(@Validated @RequestBody UploadFileObjec uploadFileObjec) {
//        /**
//         * 选中的文件夹里面包含的文件有:config.xml,海报图片,推荐图片,视频,或歌曲,歌词,专辑图片
//         * 读取config.xml文件里的内容,将视频,海报图片,推荐图片,都安放在指定目录下.
//         * 同时读取文件分类和视频类型,配置对应的value值
//         */
//        System.out.println("USB导入内容分类:"+uploadFileObjec.getFileType());
//        String fileType = uploadFileObjec.getFileType();
//        //校验选择的文件与内容类型是否匹配
//        //解析上传文件的所有config.xml文件是否符合选择的类型
//        AjaxResult ajaxResult = CheckXml.checkFile(uploadFileObjec);
//        System.out.println("文件校验结果:"+ajaxResult.toString());
//        if (ajaxResult.isError()){
//            return ajaxResult;
//        }
//
//        //文件夹下的所有文件和文件夹全选,该文件夹目录会上传
//        //当不是全选时,会只上传指定文件目录
//        List<String> uploadFilePaths = uploadFileObjec.getFilePaths();
//        int size = uploadFilePaths.size();
//        System.out.println("size: "+size);
//        List<String> filePaths = filterFilePathsDir(uploadFilePaths);  //返回的是具体的文件夹
//        System.out.println("filterFilePathsDir filePaths size:"+filePaths.size());
//
//        String taskId = "";
//        SysBatch result = new SysBatch();
//        do {
//            taskId = UUID.randomUUID().toString();
//            result = sysBatchService.selectSysBatchByTaskId(taskId);
//        }while (StringUtils.isNotNull(result));
//        uploadProgressMap.put(taskId, 0);
//        uploadProgressTotalMap.put(taskId, 0);
//
//        String userName = getLoginUser().getUser().getUserName();
//        SysBatch sysBatch = new SysBatch();
//        sysBatch.setUserName(userName);
//        sysBatch.setStartTime(new Date());
//        sysBatch.setTaskId(taskId);
//        sysBatch.setType(fileType);
//        sysBatchService.insertSysBatch(sysBatch);
//
//        String finalTaskId = taskId;
//        new Thread(() -> {
//            uploadFiles(filePaths, finalTaskId, userName,fileType);
//        }).start();
//
//        return AjaxResult.success("文件上传进度taskId: "+taskId,taskId);
//    }
//
//    public static List<String> filterFilePathsDir(List<String> filePaths) {
//        List<String> filteredPaths = new ArrayList<>();
//
//        List<String> dirTempPaths = new ArrayList<>();
//        List<String> fileTempPaths = new ArrayList<>();
//        //先将文件夹和文件进行分类
//        for (String filePath : filePaths) {
//            File file = new File(filePath);
//            if (file.isDirectory()) {
//                // 如果是文件夹，直接添加到过滤后的列表中
//                dirTempPaths.add(filePath);
//            }else if(file.isFile()){
//                // 如果是文件，检查其下的文件是否已经在列表中
//                fileTempPaths.add(filePath);
//            }
//        }
//        System.out.println(fileTempPaths.size()+"===================="+dirTempPaths.size()+"==========="+fileTempPaths.size());
//        //选中提交的路径列表里只有文件夹  ==>直接读取文件夹下的所有文件
//        //选中提交的路径列表里只有文件  ==>读取该列表下的所有文件
//        //选中提交的路径列表里有的有文件夹也有文件 ==>以选中的文件夹为准,文件不记
//        if (dirTempPaths.size() > 0) {
//            return dirTempPaths;
//        }else{
//            if (fileTempPaths.size() > 0) {
//                File file = new File(fileTempPaths.get(0));
//                File parentFile = file.getParentFile();
//                filteredPaths.add(parentFile.getAbsolutePath());
//            }
//            return filteredPaths;
//        }
//    }
//    /**
//     * 递归查找指定目录及其子目录下的所有文件  统计上传文件总个数
//     * @param directory 要查找的目录
//     */
//    public static int findFilesInSubdirectories(File directory,int count) {
//        System.out.println("count开始:"+count);
//        // 检查目录是否存在且为目录
//        if (directory.exists() && directory.isDirectory()) {
//            // 获取目录下的所有文件和子目录
//            File[] files = directory.listFiles();
//            if (files != null) {
//                for (File file : files) {
//                    if (file.isFile()) {
//                        // 如果是文件，打印文件的绝对路径
////                        System.out.println("找到文件: " + file.getAbsolutePath());
//                        if (FileUploadUtils.isAllowedExtension(file.getName(), TaskConstans.XML_NAME)){
//                            //将文件夹下的所有文件都复制上传
//                            count++;
//                        }
//                    } else if (file.isDirectory()) {
//                        // 如果是子目录，递归调用该方法
//                        count = findFilesInSubdirectories(file,count);
//                    }
//                }
//            }
//        } else {
//            System.out.println("指定的路径不是一个有效的目录。"+directory.getAbsolutePath());
//        }
//        System.out.println("count结束: "+count);
//        return count;
//    }
//
//    //进行文件上传
//    private AjaxResult uploadFiles(List<String> filePaths, String taskId ,String userName,String fileType) {
//        //选择文件上传,这里获取到的文件总数是当前文件下的所有具体文件,不包括文件夹
//        //如果选中的文件中包括了文件夹,需要剔除
//        System.out.println("文件上传======================================================uploadFiles========================================");
//        //filePaths是具体的文件路径
//        //包含文件和文件夹目录
//        int totalFileSizes = 0;
//        // 统计所有文件数量,该路径已经被算过,只存在具体的文件,没有文件夹
//        for (String filePath : filePaths) {
//            File directory = new File(filePath);
//            if (directory.isDirectory()){
//                totalFileSizes = findFilesInSubdirectories(directory,totalFileSizes);
//            }else{
//                if (FileUploadUtils.isAllowedExtension(directory.getName(),TaskConstans.XML_NAME)){
//                    //将文件夹下的所有文件都复制上传
//                    totalFileSizes++;
//                }
//            }
//        }
//
//        System.out.println("totalFileSizes: "+totalFileSizes);
//        if (totalFileSizes == 0) {
//            SysBatch sysBatch = sysBatchService.selectSysBatchByTaskId(taskId);
//            if (sysBatch != null) {
//                sysBatch.setStatus("1");
//                sysBatch.setRemake("请选择符合格式的文件夹上传");
//                sysBatch.setEndTime(new Date());
//                sysBatchService.updateSysBatch(sysBatch);
//            }
//            sysOperLogService.insertOperlogError("上传文件失败,选择的文件夹内的文件格式不正确,请选择符合格式的文件夹上传");
//            return AjaxResult.warn("请选择符合格式的文件夹上传");
//        }
//        uploadProgressTotalMap.put(taskId, totalFileSizes);
////        String uploadPathDir = PlayControlConfig.getUploadPath()+File.separator+ DateUtils.dateTimeNow();
//        // 上传文件个数记录
//        int uploadedFilesCount = 0;
//        for (String filePath : filePaths) {
//            File directory = new File(filePath);
//            if (directory.isDirectory()) {
//                System.out.println("开始解析文件夹上传");
//                //文件夹路径uploadPath
////                uploadedFilesCount = uploadFilesAndFolders(filePath,uploadPathDir,uploadedFilesCount,taskId,userName,totalFileSizes,fileType);
//                uploadedFilesCount = uploadFilesAndFolders(filePath,uploadedFilesCount,taskId,userName,totalFileSizes,fileType);
//                System.out.println("文件夹上传个数uploadedFilesCount : "+uploadedFilesCount);
//                int progress = (int) ((uploadedFilesCount / (double) totalFileSizes) * 100);
//                System.out.println("计算进度 progress:"+progress);
//                uploadProgressMap.put(taskId, progress);
//            } else {
//                System.out.println("开始单文件进行上传,解析");
//                //当遍历循环,发现该文件是一个xml文件时,读取该config.xml文件下的同级文件,
//                //将文件上传,并将文件地址存入数据库中
//                String destDirectory = PlayDataConfig.getZipFilePath();
//                String configFileName = directory.getName();
//                if (FileUploadUtils.isAllowedExtension(configFileName,TaskConstans.XML_NAME)){
//                    File parentFile = directory.getParentFile();
//                    System.out.println("uploadFiles:"+parentFile.getAbsolutePath());
////                    File[] files = parentFile.listFiles();
////                    for (File file : files) {
////                        System.out.println("uploadPathDir:"+uploadPathDir);
////                        FileUtils.copyFileToDirectory(directory.getAbsolutePath(),uploadPathDir);
////                    }
////                    File[] uploadFile = parentFile.listFiles();
////                    for (File file : uploadFile) {
//                        AjaxResult ajaxResult = new AjaxResult();
//                        if (SysTvType.movieDefaultId.equals(fileType)){
//                            ajaxResult = movieFileService.setMovieUpdateFile(parentFile.getAbsolutePath(), userName, taskId);
//                        }else if(SysTvType.songDefaultId.equals(fileType)){
//                            ajaxResult = songFileService.setSongUpdateFile(parentFile.getAbsolutePath(),userName,taskId);
//                        }
//                        if (StringUtils.isNotNull(ajaxResult) && ajaxResult.isError()){
//                            SysBatch sysBatch = sysBatchService.selectSysBatchByTaskId(taskId);
//                            if (sysBatch != null) {
//                                sysBatch.setStatus("1");
//                                sysBatch.setEndTime(new Date());
//                                sysBatch.setRemake(ajaxResult.get(AjaxResult.MSG_TAG).toString());
//                                sysBatchService.updateSysBatch(sysBatch);
//                            }
//                        }
////                    }
//                }
//                uploadedFilesCount++;
//                System.out.println("文件上传个数uploadedFilesCount : "+uploadedFilesCount);
//                int progress = (int) ((uploadedFilesCount / (double) totalFileSizes) * 100);
//                System.out.println("计算进度 progress:"+progress);
//                uploadProgressMap.put(taskId, progress);
//            }
//        }
//        return AjaxResult.success();
//    }
//    /**
//     * 上传指定文件夹下的所有文件和文件夹到目标路径
//     * @param sourceDir 源文件夹路径
//     */
//    public int uploadFilesAndFolders(String sourceDir, int count, String taskId,String userName,Integer totalFileSizes,String fileType) {
//        System.out.println("===========================uploadFilesAndFolders*************************************");
//        File source = new File(sourceDir);
////        File destination = new File(destDir);
//
//        // 检查源文件夹是否存在
//        if (!source.exists()) {
//            System.out.println("源文件夹不存在: " + sourceDir);
//            return count;
//        }
//        // 检查目标文件夹是否存在，不存在则创建
////        if (!destination.exists()) {
////            destination.mkdirs();
////        }
//        // 遍历源文件夹下的所有文件和文件夹
//        File[] files = source.listFiles();
//
//        if (files != null) {
//            for (File file : files) {
//
//                if (file.isDirectory()) {
//                    System.out.println("依旧是文件夹格式");
//                    // 如果是文件夹，递归调用上传方法
////                    String newDestDirTemp = destDir + File.separator + file.getName();
//                    String newSourceDir = file.getAbsolutePath();
////                    count = uploadFilesAndFolders(newSourceDir, newDestDirTemp,count,taskId,userName,totalFileSizes,fileType);
//                    count = uploadFilesAndFolders(newSourceDir,count,taskId,userName,totalFileSizes,fileType);
//                    System.out.println("文件夹上传个数uploadedFilesCount count : "+count);
//                    int progress = (int) ((count / (double) totalFileSizes) * 100);
//                    System.out.println("文件夹计算进度 progress count:"+progress);
//                    uploadProgressMap.put(taskId, progress);
//                } else {
////                    System.out.println("确定是单个文件,开始进行文件复制");
////                    System.out.println("文件进行复制:$$$$$$$$$$$" + file.getAbsolutePath());
//                    String destDirectory = PlayDataConfig.getZipFilePath();
//                    String configFileName = file.getName();
//                    if (FileUploadUtils.isAllowedExtension(configFileName,TaskConstans.XML_NAME)){
//                        File parentFile = file.getParentFile();
//                        System.out.println("uploadFilesAndFolders:"+parentFile.getAbsolutePath());
////                        File[] files1 = parentFile.listFiles();
////                        for (File everyFile : files1) {
////                            String newDestDirTemp = destDir + File.separator + everyFile.getName();
////                            System.out.println("newDestDirTemp:"+newDestDirTemp);
////                            FileUtils.copyFileToDirectory(file.getAbsolutePath(),newDestDirTemp);
////                        }
//                        System.out.println(fileType+" fileType的值");
////                    File[] uploadFile = parentFile.listFiles();
////                    for (File s : uploadFile) {
//                        AjaxResult ajaxResult = new AjaxResult();
//                        if (SysTvType.movieDefaultId.equals(fileType)){
//                            System.out.println("电影内容的数据处理@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
//                            ajaxResult = movieFileService.setMovieUpdateFile(parentFile.getAbsolutePath(),userName,taskId);
//                        }else if(SysTvType.songDefaultId.equals(fileType)) {
//                            System.out.println("歌曲内容的数据处理&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//                            ajaxResult = songFileService.setSongUpdateFile(parentFile.getAbsolutePath(), userName, taskId);
//                        }
//                        if (StringUtils.isNotNull(ajaxResult) && ajaxResult.isError()){
//                            SysBatch sysBatch = sysBatchService.selectSysBatchByTaskId(taskId);
//                            if (sysBatch != null) {
//                                sysBatch.setStatus("1");
//                                sysBatch.setEndTime(new Date());
//                                sysBatch.setRemake(ajaxResult.get(AjaxResult.MSG_TAG).toString());
//                                sysBatchService.updateSysBatch(sysBatch);
//                            }
//                        }
//                        count++;
////                    }
//                    }
//
//                    System.out.println("文件上传个数count : "+count);
//                    int progress = (int) ((count / (double) totalFileSizes) * 100);
//                    System.out.println("计算进度 progress:"+progress);
//                    uploadProgressMap.put(taskId, progress);
//                }
//            }
//        }
//        return count;
//    }
//
//    @GetMapping("/api/uploadProgress/{taskId}")
//    public Map<String, Integer> getUploadProgress(@PathVariable String taskId) {
//        Map<String, Integer> response = new HashMap<>();
//        Integer progress = uploadProgressMap.getOrDefault(taskId, 0);
//        response.put("progress", progress);
//
//        Integer total = uploadProgressTotalMap.getOrDefault(taskId, 0);
//        response.put("total", total);
//
//
//        if (progress == 100) {
//            SysBatch sysBatch = sysBatchService.selectSysBatchByTaskId(taskId);
//            sysBatch.setEndTime(new Date());
//            String type = sysBatch.getType();
//            if (type.equals(SysTvType.movieDefaultId)){
//                SysContentData sysContentData = new SysContentData();
//                sysContentData.setTaskId(taskId);
//                List<SysContentData> sysContentDatas = sysContentDataService.selectSysContentDataList(sysContentData);
//                if (sysContentDatas.size() != 0) {
//                    sysBatch.setStatus("0");
//                    sysBatch.setNumber(String.valueOf(sysContentDatas.size()));
//                    sysBatch.setContentEnd(sysContentDatas.get(0).getId().toString());
//                    sysBatch.setContentStart(sysContentDatas.get(sysContentDatas.size() - 1).getId().toString());
//                    sysBatch.setRemake("通过在服务器上挂载USB导入电影");
//                }
//            }else if(type.equals(SysTvType.songDefaultId)){
//                SysSongData sysSongData = new SysSongData();
//                sysSongData.setTaskId(taskId);
//                List<SysSongData> sysSongData1 = sysSongDataService.selectSysSongDataList(sysSongData);
//                if (sysSongData1.size() != 0){
//                    sysBatch.setRemake("0");
//                    sysBatch.setNumber(String.valueOf(sysSongData1.size()));
//                    sysBatch.setContentEnd(sysSongData1.get(0).getId().toString());
//                    sysBatch.setContentStart(sysSongData1.get(sysSongData1.size() - 1).getId().toString());
//                    sysBatch.setRemake("通过在服务器上挂载USB导入音乐");
//                }
//            }
//            sysOperLogService.insertOperlogSuccess("批次上传文件成功:上传任务taskId: " + sysBatch.getTaskId());
//
//            sysBatchService.updateSysBatch(sysBatch);
//        }
//        return response;
//    }
//}